httpGet、exec 與 tcpSocket。在前面的章節中,Kubernetes 主要是透過監控容器的 進程(Process) 是否存活來判斷容器是否健康。但很多時候,系統會遇到以下「假活」的情況:
為了讓 Kubernetes 能「真正理解」應用程式內部的健康狀況,我們需要使用 Probes(健康檢查探針)。
Kubernetes 提供了三種不同階段與目的的探針:
| 探針類型 | 核心問題 | 檢查失敗時的處置動作 | 典型應用場景 |
|---|---|---|---|
| Startup Probe | 應用程式「開機完成了嗎?」 | 殺死容器並重新啟動 | 啟動特別緩慢的傳統大型系統(如大型 Java 服務) |
| Liveness Probe | 應用程式「還活著嗎?有沒有卡死?」 | 殺死容器並重新啟動(Self-healing) | 偵測程式死鎖(Deadlock)、內部崩潰卡死 |
| Readiness Probe | 應用程式「現在準備好接客(流量)了嗎?」 | 不殺容器,將 Pod 從 Service 的 Endpoints 踢出,暫停轉發流量 | 等待快取預熱、外部資料庫連線恢復 |
Kubernetes 支援以下三種探測機制:
httpGet:向容器指定 Port 和 Path 發送 HTTP GET 請求(回傳 HTTP 200–399 視為成功,其餘視為失敗)。exec:在容器內部執行指定的 Shell 指令(Exit Code 為 0 視為成功)。tcpSocket:嘗試與容器指定 Port 建立 TCP 連線(連線成功即視為健康)。我們建立一個模擬應用:開機前 15 秒建立 /tmp/healthy 檔案,15 秒後刪除該檔案模擬程式崩潰。
liveness-demo.yamlapiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 15; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 # 容器啟動後 5 秒開始第一次檢查
periodSeconds: 5 # 每隔 5 秒檢查一次
failureThreshold: 2 # 連續失敗 2 次即判定為不健康
kubectl apply -f liveness-demo.yaml
# 持續觀察 Pod 狀態與重啟次數 (RESTARTS)
kubectl get pods liveness-exec-pod -w
你會發現:
Running,RESTARTS 為 0。建立一個標準的 HTTP 探針範例,只有當 /healthz 端點回傳 200 時,Service 才會將流量導向該 Pod。
readiness-demo.yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: readiness-deployment
spec:
replicas: 2
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10 # 模擬前 10 秒在暖機
periodSeconds: 3
套用配置:
kubectl apply -f readiness-demo.yaml
觀察 Pod 狀態:
kubectl get pods -l app=web-app
在前 10 秒內,你會看到 READY 欄位顯示 0/1,雖然容器已經在執行,但此時任何外部流量都不會被送進來。直到 10 秒後探針通過,READY 才會變成 1/1,開始正式接客!
initialDelaySeconds:容器啟動後延遲幾秒才開始執行探針(避免太早檢查導致誤殺)。periodSeconds:檢查間隔頻率(預設 10 秒)。timeoutSeconds:每次檢查等待回應的超時時間(預設 1 秒)。successThreshold:探針失敗後,需連續成功幾次才算恢復健康(預設 1 次)。failureThreshold:需連續失敗幾次才正式觸發重啟或踢除動作(預設 3 次)。今天我們搞懂了容器維運中最重要的「體檢制度」:
當我們的系統具備了自我修復能力後,如果突然迎來雙 11 或促銷活動帶來的數倍流量,我們該如何讓 Kubernetes 自動根據 CPU 負載加開 Pod 副本?
明天 Day 23,我們將學習自動彈性伸縮的神技:「自動彈性伸縮:Horizontal Pod Autoscaler (HPA) 實戰」!